package com.kdzy.lshy.socity_server.service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.kdzy.lshy.socity_server.common.*;
import com.kdzy.lshy.socity_server.common.wechart.SignatureUtil;
import com.kdzy.lshy.socity_server.common.wechart.VisitUrl;
import com.kdzy.lshy.socity_server.common.wechart.WechartCommon;
import com.kdzy.lshy.socity_server.repository.BaseDao;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
import redis.clients.jedis.Jedis;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.*;

import static com.kdzy.lshy.socity_server.common.wechart.WXCore.decrypt;

/**
 * 社区直通车service
 * @author cly
 * @since 2018-07-23
 */
@Service
public class SocityQuickService extends BaseService {

    private static final Logger logger = LoggerFactory.getLogger(SocityQuickService.class);

    @Resource
    private BaseDao baseDao;

    /**
     * 补充居住证
     * @param param 包含居住证照片路径等信息
     * @return 结果集 - 补充是否成功
     */
    public Object doResidentPermits(String param, HttpServletRequest request) {
        LinkedHashMap<Object, Object> map = null;
        try {
            if (StringUtils.isNoneBlank(StringUtils.trim(param))){
                // 1.解析json数据
                JSONObject jsonObject = JSON.parseObject(param);
                Long stamp = jsonObject.getLong("stamp"); // 时间戳
                Integer version = jsonObject.getInteger("version"); // 版本 0:测试 1:生产
                Integer visitType = jsonObject.getInteger("visit_type"); // 访问类型 0:测试 1:生产
                Integer visitPlat = jsonObject.getInteger("visit_plat"); // 访问平台 0:网页 1:一体机 2:小程序 3:其他
                Integer isUsed = jsonObject.getInteger("is_used"); // 是否有效 0:有效 1:无效

                String quickId = jsonObject.getString("quickId"); // 记录唯一标识
                String resId = jsonObject.getString("res_id"); // 证件ID
                Integer resNum = jsonObject.getInteger("res_num"); // 证件份数
                Integer resType = jsonObject.getInteger("res_type"); // 证件类型  0照片 1excel 2pdf 3doc 4zip 5其他
                String resUrl = jsonObject.getString("res_url"); // 证件存储地址

                // 参数非空判断
                if (stamp == null) {
                    logger.info("参数stamp为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 = " + JSON.toJSONString(map));
                    return map;
                }
                if (version == null) {
                    logger.info("参数version为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }
                if (isUsed == null) {
                    logger.info("参数is_used为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }
                if (visitPlat == null) {
                    logger.info("参数visit_plat为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }
                if (visitType == null) {
                    logger.info("参数visit_type为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }

                if (StringUtils.isBlank(StringUtils.trim(quickId))) {
                    logger.info("参数quickId为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }
                if (StringUtils.isBlank(StringUtils.trim(resId))) {
                    logger.info("参数res_id为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }
                if (resNum == null) {
                    logger.info("参数res_num为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }
                if (resType == null) {
                    logger.info("参数res_type为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }
                if (StringUtils.isBlank(StringUtils.trim(resUrl))) {
                    logger.info("参数res_url为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }

                //**********************************************************
                String systoken = null;
                if (!(jsonObject.getInteger("visit_plat") != 0)) { // 网页端
                    systoken = jsonObject.getString("systoken"); // 全局token
                    if (StringUtils.isBlank(systoken)) {
                        logger.info("systoken为空");
                        map = ResultMap.creatReault("33", "失败", "token为空");
                        logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 = " + JSON.toJSONString(map));
                        return map;
                    }
                }

                String officerId = null;
                if (jsonObject.getInteger("visit_plat") == 0) { // 网页端

                    // 根据身份证从redis中获取token
                    Jedis jedis = new Jedis("140.143.210.101", 6379);
                    jedis.auth("q1w2e3r4t5");

                    List<String> infoList = jedis.hmget(systoken, "systoken", "officerId");
                    String systokenRedis = null;
                    if (infoList != null && infoList.size() > 0) {
                        systokenRedis = infoList.get(0); // token
                        officerId = infoList.get(1); // 用户id
                    }

                    // 查看token是否过期
                    if (StringUtils.isBlank(systokenRedis)) { // 重新登录，弹出登录框
                        logger.info("全局systoken过期，需要重新获取systoken");
                        map = ResultMap.creatReault("33", "失败", "systoken过期");
                        logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 = " + JSON.toJSONString(map));
                        return map;
                    }

                    // token不一致
                    if (!StringUtils.equals(systokenRedis, systoken)) {
                        logger.info("用户访问的token不一致");
                        map = ResultMap.creatReault("331", "失败", "systoken不一致");
                        logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 = " + JSON.toJSONString(map));
                        return map;
                    }

                }
                //**********************************************************

                String createTime = DateUtil.format(new Date(stamp), "yyyy-MM-dd HH:mm:dd"); // 创建时间yyyy-MM-dd HH:mm:ss

                // 根据quickId查询相关业务参数
                String queryQuickSql = "SELECT\n" +
                        "\tsq.process_id processId,\n" +
                        "\tsq.dweller_id dwellerId,\n" +
                        "\tsq.bizz_id bizzId\t\n" +
                        "FROM\n" +
                        "\tsocity_quick sq\n" +
                        "WHERE\n" +
                        "\tsq.ID = '" + quickId + "'";
                List<Map<String, Object>> quickInfoList = baseDao.getAllByCondition(queryQuickSql);
                if (quickInfoList == null || quickInfoList.size() <= 0) { // 没有该记录
                    logger.info("记录不存在");
                    map = ResultMap.creatReault("1", "失败", "记录不存在");
                    logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }

                String ID = UUID.randomUUID().toString().replace("-", "");
                String sqCreateTime = (String) quickInfoList.get(0).get("processId"); // 直通车业务process_id
                String dwellerId = (String) quickInfoList.get(0).get("dwellerId"); // 居民id
                String bizzId = (String) quickInfoList.get(0).get("bizzId"); // 业务id

                // 查询是否已经上传过居住证
                String isUploadSql = "SELECT\n" +
                        "\tcount(*) AS count\n" +
                        "FROM\n" +
                        "\tsocity_quick_resource sqr\n" +
                        "WHERE\n" +
                        "\tsqr.sq_create_time = '"+sqCreateTime+"'\n" +
                        "AND sqr.res_id = '"+resId+"'";
                Long count = baseDao.getCount(isUploadSql);
                if (count == 1) {
                    // 该业务流程已经上传过居住证了
                    // 向socity_quick_resource表(社区直通-证件表)中更新该业务的居住证信息
                    String insertQuickResourceSql = "UPDATE \n" +
                            "\tsocity_quick_resource\n" +
                            "SET \n" +
                            "\tres_num = "+resNum+", \n" +
                            "\tres_type = "+resType+", \n" +
                            "\tres_url = '"+resUrl+"',\n" +
                            "\tupdate_time = '"+createTime+"',\n" +
                            "\tstamp = '"+stamp+"',\n" +
                            "\tversion ="+version+",\n" +
                            "\tvisit_plat ="+visitPlat+",\n" +
                            "\tvisit_type ="+visitType+",\n" +
                            "\tis_used ="+isUsed+"\n" +
                            "WHERE\n" +
                            "\tsq_create_time = '"+sqCreateTime+"'\n" +
                            "AND res_id = '"+resId+"'";
                    int update = baseDao.update(insertQuickResourceSql);
                    if (update <= 0) {
                        logger.info("更新socity_quick_resource表失败");
                        map =  ResultMap.creatReault("77", "失败", "数据库操作失败");
                        logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 = " + JSON.toJSONString(map));
                        return map;
                    }
                }
                if (count == 0) {
                    // 该业务流程还未上传居住证
                    // 向socity_quick_resource表(社区直通-证件表)中添加该业务的居住证信息
                    String insertQuickResourceSql = "INSERT INTO socity_quick_resource (\n" +
                            "\tID,\n" +
                            "\tsq_create_time,\n" +
                            "\tdweller_id,\n" +
                            "\tbizz_id,\n" +
                            "\tres_id,\n" +
                            "\tres_num,\n" +
                            "\tres_type,\n" +
                            "\tres_url,\n" +
                            "\tcreate_time,\n" +
                            "\tstamp,\n" +
                            "\tversion,\n" +
                            "\tvisit_plat,\n" +
                            "\tvisit_type,\n" +
                            "\tis_used\n" +
                            ")\n" +
                            "VALUES\n" +
                            "(\n" +
                            "\t'" + ID + "',\n" +
                            "\t'" + sqCreateTime + "',\n" +
                            "\t'" + dwellerId + "',\n" +
                            "\t'" + bizzId + "',\n" +
                            "\t'" + resId + "',\n" +
                            "\t" + resNum + ",\n" +
                            "\t" + resType + ",\n" +
                            "\t'" + resUrl + "',\n" +
                            "\t'" + createTime + "',\n" +
                            "\t" + stamp + ",\n" +
                            "\t" + version + ",\n" +
                            "\t" + visitPlat + ",\n" +
                            "\t" + visitType + ",\n" +
                            "\t" + isUsed + "\n" +
                            ")";
                    int update = baseDao.update(insertQuickResourceSql);
                    if (update <= 0) {
                        logger.info("插入socity_quick_resource表失败");
                        map =  ResultMap.creatReault("77", "失败", "数据库操作失败");
                        logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 = " + JSON.toJSONString(map));
                        return map;
                    }
                }

                map = ResultMap.creatReault("0", "成功", "更新居住证成功");
                logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 = " + JSON.toJSONString(map));
                return map;

            } else {
                logger.info("参数为空");
                map = ResultMap.creatReault("88", "失败", "参数为空");
            }
        } catch (ClassCastException e) {
            logger.info("后台处理异常，异常信息1：" + ExceptionDetailMessage.getExceptionDetail(e));
            map = ResultMap.creatReault("98", "失败", "参数类型错误");
            logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 =  " + JSON.toJSONString(map));
            return map;
        } catch (Exception e) {
            logger.info("后台处理异常，异常信息：" + ExceptionDetailMessage.getExceptionDetail(e));
            map = ResultMap.creatReault("99", "失败", "后台处理异常");
            logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 =  " + JSON.toJSONString(map));
            return map;
        }

        logger.info("出去《社区直通车 - 补充居住证》doResidentPermits()方法；出参 =  " + JSON.toJSONString(map));
        return map;
    }

    /**
     * 检查String类型的是否为空
     * @param param
     * @return
     */
    private boolean checkParamIsNull(Object param) {
        if (null == param) {
            return false;
        }

        if (param instanceof String) { // 字符串类型
            if (StringUtils.isNoneBlank(StringUtils.trim((String)param))) {
                return true;
            } else {
                return false;
            }
        }

        return true;
    }

    /**
     * 查询居住证 - 居民
     * @param param 包含居民id，业务id等等
     * @return 结果集 - 居住证信息
     */
    public Object dwellerResidentPermitsList(String param, HttpServletRequest request) {
        LinkedHashMap<Object, Object> map = null;
        try {
            if (StringUtils.isNoneBlank(StringUtils.trim(param))){
                // 1.解析json数据
                JSONObject jsonObject = JSON.parseObject(param);
                Long stamp = jsonObject.getLong("stamp"); // 时间戳
                Integer version = jsonObject.getInteger("version"); // 版本 0:测试 1:生产
                Integer visitType = jsonObject.getInteger("visit_type"); // 访问类型 0:测试 1:生产
                Integer visitPlat = jsonObject.getInteger("visit_plat"); // 访问平台 0:网页 1:一体机 2:小程序 3:其他
                Integer isUsed = jsonObject.getInteger("is_used"); // 是否有效 0:有效 1:无效

                String dwellerId = jsonObject.getString("dweller_id"); // 居民ID
                String bizzId = jsonObject.getString("bizz_id"); // 业务ID
                String resId = jsonObject.getString("res_id"); // 证件资料ID

                // 参数非空判断
                if (stamp == null) {
                    logger.info("参数stamp为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 查询居住证 - 居民》dwellerResidentPermitsList()方法；出参 = " + JSON.toJSONString(map));
                    return map;
                }
                if (version == null) {
                    logger.info("参数version为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 查询居住证 - 居民》dwellerResidentPermitsList()方法；出参 = " + JSON.toJSONString(map));
                    return map;
                }
                if (isUsed == null) {
                    logger.info("参数is_used为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 查询居住证 - 居民》dwellerResidentPermitsList()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }
                if (visitPlat == null) {
                    logger.info("参数visit_plat为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 查询居住证 - 居民》dwellerResidentPermitsList()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }
                if (visitType == null) {
                    logger.info("参数visit_type为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 查询居住证 - 居民》dwellerResidentPermitsList()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }

                if (StringUtils.isBlank(StringUtils.trim(dwellerId))) {
                    logger.info("参数dweller_id为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 查询居住证 - 居民》dwellerResidentPermitsList()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }
                if (StringUtils.isBlank(StringUtils.trim(resId))) {
                    logger.info("参数res_id为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 查询居住证 - 居民》dwellerResidentPermitsList()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }
                if (StringUtils.isBlank(StringUtils.trim(bizzId))) {
                    logger.info("参数bizz_id为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 查询居住证 - 居民》dwellerResidentPermitsList()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }

                String systoken = null;
                if (visitPlat == 0) { // 网页端
                    systoken = (String)jsonObject.get("systoken"); // 全局token
                    if (StringUtils.isBlank(systoken)) {
                        logger.info("systoken为空");
                        map = ResultMap.creatReault("33", "失败", "token为空");
                        logger.info("出去《社区直通车 - 查询居住证 - 居民》dwellerResidentPermitsList()方法；出参 =  " + JSON.toJSONString(map));
                        return map;
                    }
                }

                 //判断token是否正常
                if (visitPlat == 0) { // 网页端
                    // 根据身份证从redis中获取token
                    Jedis jedis = new Jedis("140.143.210.101", 6379);
                    jedis.auth("q1w2e3r4t5");

                    List<String> infoList = jedis.hmget(systoken, "systoken",  "dwellerIdcard", "dwellerId");
                    String systokenRedis = null;
                    if (infoList != null && infoList.size() > 0) {
                        systokenRedis = infoList.get(0); // token
                        dwellerId = infoList.get(2); // 居民唯一标识
                    }

                    // 查看token是否过期
                    if (StringUtils.isBlank(systokenRedis)) { // 重新登录，弹出登录框
                        logger.info("全局systoken过期，需要重新获取systoken");
                        map = ResultMap.creatReault("33", "失败", "systoken过期");
                        logger.info("出去《社区直通车 - 查询居住证 - 居民》dwellerResidentPermitsList()方法；出参 = " + JSON.toJSONString(map));
                        return map;
                    }

                    // token不一致
                    if (!StringUtils.equals(systokenRedis, systoken)) {
                        logger.info("用户访问的token不一致");
                        map = ResultMap.creatReault("331", "失败", "systoken不一致");
                        logger.info("出去《社区直通车 - 查询居住证 - 居民》dwellerResidentPermitsList()方法；出参 = " + JSON.toJSONString(map));
                        return map;
                    }

                }

                // 根据dwellerId查询相关的居住证信息
                String sql = "SELECT\n" +
                        "\tsqr.res_url resUrl,\n" +
                        "\tsqr.create_time createTime\n" +
                        "FROM\n" +
                        "\tsocity_quick_resource sqr\n" +
                        "WHERE\n" +
                        "\tsqr.dweller_id = '"+dwellerId+"'\n" +
                        "AND sqr.bizz_id = '"+bizzId+"'\n" +
                        "AND sqr.res_id = '"+resId+"'\n" +
                        "ORDER BY sqr.sq_create_time DESC";
                List<Map<String, Object>> list = baseDao.getAllByCondition(sql);
                if (list == null || list.size() <= 0) {
                    logger.info("结果集为空");
                    map = ResultMap.creatReault("1", "成功", "结果集为空");
                    logger.info("出去《社区直通车 - 查询居住证 - 居民》dwellerResidentPermitsList()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }

                map = ResultMap.creatReault("0", "成功", list);
                logger.info("出去《社区直通车 - 查询居住证 - 居民》dwellerResidentPermitsList()方法；出参 =  " + JSON.toJSONString(map));
                return map;
            } else {
                logger.info("参数为空");
                map = ResultMap.creatReault("88", "失败", "参数为空");
            }
        } catch (ClassCastException e) {
            logger.info("后台处理异常，异常信息1：" + ExceptionDetailMessage.getExceptionDetail(e));
            map = ResultMap.creatReault("98", "失败", "参数类型错误");
            logger.info("出去《社区直通车 - 查询居住证 - 居民》dwellerResidentPermitsList()方法；出参 =  " + JSON.toJSONString(map));
            return map;
        } catch (Exception e) {
            logger.info("后台处理异常，异常信息：" + ExceptionDetailMessage.getExceptionDetail(e));
            map = ResultMap.creatReault("99", "失败", "后台处理异常");
            logger.info("出去《社区直通车 - 查询居住证 - 居民》dwellerResidentPermitsList()方法；出参 =  " + JSON.toJSONString(map));
            return map;
        }

        logger.info("出去《社区直通车 - 查询居住证 - 居民》dwellerResidentPermitsList()方法；出参 =  " + JSON.toJSONString(map));
        return map;
    }

    /**
     * 更新居住证办理状态 - 工作人员
     * @param param 包含记录主键
     * @return 结果集 - 成功/失败
     */
    public Object updateResidentPermitsType(String param, HttpServletRequest request) {
        LinkedHashMap<Object, Object> map = null;
        try {
            if (StringUtils.isNoneBlank(StringUtils.trim(param))){
                // 1.解析json数据
                JSONObject jsonObject = JSON.parseObject(param);
                Long stamp = jsonObject.getLong("stamp"); // 时间戳
                Integer version = jsonObject.getInteger("version"); // 版本 0:测试 1:生产
                Integer visitType = jsonObject.getInteger("visit_type"); // 访问类型 0:测试 1:生产
                Integer visitPlat = jsonObject.getInteger("visit_plat"); // 访问平台 0:网页 1:一体机 2:小程序 3:其他
                Integer isUsed = jsonObject.getInteger("is_used"); // 是否有效 0:有效 1:无效

                String quickId = jsonObject.getString("quickId"); // socity_quick 表中记录唯一标识
                Integer resType = jsonObject.getInteger("res_type"); // 处理结果：1提交材料 2资料有误 3资料正确 4发送上门短信通知 5上门审核后失败（不在家） 6上门审核后成功 7已发放 8上门审核后失败（在家）

                String socityId = jsonObject.getString("socityId"); // 社区Id

                // 参数非空判断
                if (stamp == null) {
                    logger.info("参数stamp为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 = " + JSON.toJSONString(map));
                    return map;
                }
                if (version == null) {
                    logger.info("参数version为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 = " + JSON.toJSONString(map));
                    return map;
                }
                if (isUsed == null) {
                    logger.info("参数is_used为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }
                if (visitPlat == null) {
                    logger.info("参数visit_plat为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }
                if (visitType == null) {
                    logger.info("参数visit_type为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }

                if(!StringUtils.isNoneBlank(StringUtils.trim(quickId))) {
                    logger.info("参数quickId为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }
                if (resType == null) {
                    logger.info("参数res_type为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }

                if(!StringUtils.isNoneBlank(StringUtils.trim(socityId))) {
                    logger.info("参数socityId为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }

                //**********************************************************
                String systoken = null;
                if (!(jsonObject.getInteger("visit_plat") != 0)) { // 网页端
                    systoken = jsonObject.getString("systoken"); // 全局token
                    if (StringUtils.isBlank(systoken)) {
                        logger.info("systoken为空");
                        map = ResultMap.creatReault("33", "失败", "token为空");
                        logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 = " + JSON.toJSONString(map));
                        return map;
                    }
                }

                if (jsonObject.getInteger("visit_plat") == 0) { // 网页端

                    // 根据身份证从redis中获取token
                    Jedis jedis = new Jedis("140.143.210.101", 6379);
                    jedis.auth("q1w2e3r4t5");

                    List<String> infoList = jedis.hmget(systoken, "systoken", "officerId");
                    String systokenRedis = null;
                    if (infoList != null && infoList.size() > 0) {
                        systokenRedis = infoList.get(0); // token
                    }

                    // 查看token是否过期
                    if (StringUtils.isBlank(systokenRedis)) { // 重新登录，弹出登录框
                        logger.info("全局systoken过期，需要重新获取systoken");
                        map = ResultMap.creatReault("33", "失败", "systoken过期");
                        logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 = " + JSON.toJSONString(map));
                        return map;
                    }

                    // token不一致
                    if (!StringUtils.equals(systokenRedis, systoken)) {
                        logger.info("用户访问的token不一致");
                        map = ResultMap.creatReault("331", "失败", "systoken不一致");
                        logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 = " + JSON.toJSONString(map));
                        return map;
                    }

                }
                //**********************************************************

                String resNote = null;
                if (resType == 8) {
                    resNote = jsonObject.getString("res_note"); // 失败原因
                    if (!StringUtils.isNoneBlank(StringUtils.trim(resNote))) {
                        logger.info("参数res_note为空");
                        map = ResultMap.creatReault("88", "失败", "参数为空");
                        logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                        return map;
                    }
                }

                // 根据dwellerId查询相关的居住证信息
                String sql = "SELECT\n" +
                        "\tsq.dweller_id dwellerId,\n" +
                        "\tsq.officer_id officerId,\n" +
                        "\tsq.process_id processId,\n" +
                        "\tsq.bizz_id bizzId,\n" +
                        "\tsq.res_type resType,\n" +
                        "\tsq.create_time createTime,\n" +
                        "\tsq.version,\n" +
                        "\tsq.visit_plat visitPlat,\n" +
                        "\tsq.visit_type visitType,\n" +
                        "\tsq.note,\n" +
                        "\tsq.is_used isUsed\n" +
                        "FROM\n" +
                        "\tsocity_quick sq\n" +
                        "WHERE\n" +
                        "\tsq.ID = '" + quickId + "'";
                List<Map<String, Object>> list = baseDao.getAllByCondition(sql);
                if (list == null || list.size() < 1) {
                    logger.info("结果集为空");
                    map = ResultMap.creatReault("1", "失败", "结果集为空");
                    logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }
                if (list.size() > 1) {
                    logger.info("数据库数据主键不唯一");
                    map = ResultMap.creatReault("12", "失败", "数据有误");
                    logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }
                if (list.size() == 1) { // 正确，唯一一条记录
                    // 获取更改前状态码
                    Integer oldResType = (Integer) list.get(0).get("resType");

                    // 1.判断更新之后的状态是否符合逻辑
                    switch (oldResType) {
                        case 1: // 提交材料
                            // 更新之后的状态码只能是2、3
                            if (resType != 2 && resType != 3) {
                                logger.info("状态码更新不合逻辑");
                                map = ResultMap.creatReault("11", "失败", "只能选择<资料有误>或<资料正确>");
                                logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                                return map;
                            }
                            break;
                        case 2: // 资料有误
                            // 更新之后的状态码只能是3、4
                            if (resType != 3 && resType != 4) {
                                logger.info("状态码更新不合逻辑");
                                map = ResultMap.creatReault("11", "失败", "只能选择<资料正确>");
                                logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                                return map;
                            }
                            break;
                        case 3: // 资料正确
                            // 更新之后的状态码只能是4
                            if (resType != 4) {
                                logger.info("状态码更新不合逻辑");
                                map = ResultMap.creatReault("11", "失败", "只能选择<发送上门短信通知>");
                                logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                                return map;
                            }
                            break;
                        case 4: // 发送上门短信通知
                            // 更新之后的状态码只能是5、6、8
                            if (resType != 5 && resType != 6 && resType != 8) {
                                logger.info("状态码更新不合逻辑");
                                map = ResultMap.creatReault("11", "失败", "只能选择<上门审核后失败（不在家）>或<上门审核后成功>或<上门审核后失败（在家）>");
                                logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                                return map;
                            }
                            break;
                        case 5: // 上门审核后失败（不在家）
                            // 更新之后的状态码只能是6、8
                            if (resType != 6 && resType != 8) {
                                logger.info("状态码更新不合逻辑");
                                map = ResultMap.creatReault("11", "失败", "只能选择<上门审核后成功>或<上门审核后失败（在家）>");
                                logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                                return map;
                            }
                            break;
                        case 6: // 上门审核后成功
                            // 更新之后的状态码只能是7
                            if (resType != 7) {
                                logger.info("状态码更新不合逻辑");
                                map = ResultMap.creatReault("11", "失败", "只能选择<已发放>");
                                logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                                return map;
                            }
                            break;
                        case 7: // 已发放
                        case 8: // 上门审核后失败（在家）
                            // 业务结束，不能修改任何状态
                            logger.info("状态码更新不合逻辑");
                            map = ResultMap.creatReault("11", "失败", "该状态不能修改");
                            logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                            return map;
                            default:
                                break;
                    }
                }

                // 取值
                String dwellerId = (String) list.get(0).get("dwellerId");   // 居民id
                String officerId = (String) list.get(0).get("officerId");   // 工作人员id
                String processId = (String) list.get(0).get("processId");   // 工作人员id
                String bizzId = (String) list.get(0).get("bizzId");         // 业务id
                String createTime = (String) list.get(0).get("createTime"); // 创建时间

                // 根据创建时间来判断同一个状态是否存在重复插入
                String countResTypeSql = "SELECT\n" +
                        "\tcount(*) AS count\n" +
                        "FROM\n" +
                        "\tsocity_quick sq\n" +
                        "WHERE\n" +
                        "\tsq.process_id = '"+processId+"'\n" +
                        "AND sq.res_type ="+resType+";";
                Long count = baseDao.getCount(countResTypeSql);
                if (count == 1) {
                    logger.info("状态码更新不合逻辑");
                    map = ResultMap.creatReault("13", "失败", "不能重复插入");
                    logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }

                String note = (String) list.get(0).get("note");             // 备注

                // 生成值
                String quickIdNew = UUID.randomUUID().toString().replace("-", ""); // 新的主键id
                String updateTime = DateUtil.format(new Date(stamp), "yyyy-MM-dd HH:mm:dd"); // 更新时间 yyyy-MM-dd HH:mm:ss

                // 将数据插入数据库
                String insertQuickSql = null;
                if (!StringUtils.isNoneBlank(StringUtils.trim(resNote))) {
                    insertQuickSql = "INSERT INTO socity_quick (\n" +
                            "\tID,\n" +
                            "\tdweller_id,\n" +
                            "\tofficer_id,\n" +
                            "\tprocess_id,\n" +
                            "\tbizz_id,\n" +
                            "\tres_type,\n" +
                            "\tcreate_time,\n" +
                            "\tupdate_time,\n" +
                            "\tstamp,\n" +
                            "\tversion,\n" +
                            "\tvisit_plat,\n" +
                            "\tvisit_type,\n" +
                            "\tnote,\n" +
                            "\tis_used\n" +
                            ")\n" +
                            "VALUES\n" +
                            "\t(\n" +
                            "\t\t'"+quickIdNew+"',\n" +
                            "\t\t'"+dwellerId+"',\n" +
                            "\t\t'"+officerId+"',\n" +
                            "\t\t'"+processId+"',\n" +
                            "\t\t'"+bizzId+"',\n" +
                            "\t\t"+resType+",\n" +
                            "\t\t'"+createTime+"',\n" +
                            "\t\t'"+updateTime+"',\n" +
                            "\t\t"+stamp+",\n" +
                            "\t\t"+version+",\n" +
                            "\t\t"+visitPlat+",\n" +
                            "\t\t"+visitType+",\n" +
                            "\t\t'"+note+"',\n" +
                            "\t\t"+isUsed+"\n" +
                            "\t)";
                } else {
                    insertQuickSql = "INSERT INTO socity_quick (\n" +
                            "\tID,\n" +
                            "\tdweller_id,\n" +
                            "\tofficer_id,\n" +
                            "\tprocess_id,\n" +
                            "\tbizz_id,\n" +
                            "\tres_type,\n" +
                            "\tres_note,\n" +
                            "\tcreate_time,\n" +
                            "\tupdate_time,\n" +
                            "\tstamp,\n" +
                            "\tversion,\n" +
                            "\tvisit_plat,\n" +
                            "\tvisit_type,\n" +
                            "\tnote,\n" +
                            "\tis_used\n" +
                            ")\n" +
                            "VALUES\n" +
                            "\t(\n" +
                            "\t\t'"+quickIdNew+"',\n" +
                            "\t\t'"+dwellerId+"',\n" +
                            "\t\t'"+officerId+"',\n" +
                            "\t\t'"+processId+"',\n" +
                            "\t\t'"+bizzId+"',\n" +
                            "\t\t"+resType+",\n" +
                            "\t\t'"+resNote+"',\n" +
                            "\t\t'"+createTime+"',\n" +
                            "\t\t'"+updateTime+"',\n" +
                            "\t\t"+stamp+",\n" +
                            "\t\t"+version+",\n" +
                            "\t\t"+visitPlat+",\n" +
                            "\t\t"+visitType+",\n" +
                            "\t\t'"+note+"',\n" +
                            "\t\t"+isUsed+"\n" +
                            "\t)";
                }
                int update = baseDao.update(insertQuickSql);
                if (update < 1) {
                    logger.info("数据插入失败");
                    map = ResultMap.creatReault("77", "失败", "数据库操作失败");
                    logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                    return map;
                }

                // 如果状态更新res_type = 7（已发放），需要更新一下dweller_soctiy表
                // 1.准备数据
                String dsId = UUID.randomUUID().toString().replace("-", "");
                // 2.编写sql语句
                String insertDwellerSocitySql = "INSERT INTO dweller_socity(\n" +
                        "\tID,\n" +
                        "\tsocity_id,\n" +
                        "\tdweller_id,\n" +
                        "\tjoin_time,\n" +
                        "\tcreate_time,\n" +
                        "\tstamp,\n" +
                        "\tversion,\n" +
                        "\tvisit_plat,\n" +
                        "\tvisit_type,\n" +
                        "\tis_used\n" +
                        ") \n" +
                        "VALUES(\n" +
                        "\t'"+dsId+"',\n" +
                        "\t'"+socityId+"',\n" +
                        "\t'"+dwellerId+"',\n" +
                        "\t'"+createTime+"',\n" + // 申请时间
                        "\t'"+updateTime+"',\n" + // 档期那时间戳生成的时间
                        "\t'"+stamp+"',\n" +
                        "\t"+version+",\n" +
                        "\t"+visitPlat+",\n" +
                        "\t"+visitType+",\n" +
                        "\t"+isUsed+"\n" +
                        ")";
                // 3.执行sql
                int update1 = baseDao.update(insertDwellerSocitySql);
                if (update1 < 1) {
                    logger.info("插入表dweller_socity数据失败");
                }

                map = ResultMap.creatReault("0", "成功", "状态更新成功");
                logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
                return map;
            } else {
                logger.info("参数为空");
                map = ResultMap.creatReault("88", "失败", "参数为空");
            }
        } catch (ClassCastException e) {
            logger.info("后台处理异常，异常信息1：" + ExceptionDetailMessage.getExceptionDetail(e));
            map = ResultMap.creatReault("98", "失败", "参数类型错误");
            logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
            return map;
        } catch (Exception e) {
            logger.info("后台处理异常，异常信息：" + ExceptionDetailMessage.getExceptionDetail(e));
            map = ResultMap.creatReault("99", "失败", "后台处理异常");
            logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
            return map;
        }

        logger.info("出去《社区直通车 - 更新居住证办理状态 - 工作人员》updateResidentPermitsType()方法；出参 =  " + JSON.toJSONString(map));
        return map;
    }
}
